// pages/cuesDetail/index.ts

import {fontSizeCalc, handleCode, handleErrCode} from "../../utils/util";
import {getCuesTopicDetails, getShareAccountPage, resetShareAccount} from "../../service/api/api-cues-topic";
import {getCuesSubmitPage} from "../../service/api/api-cues-submit";

let shareUserIds = new Set(),// 选中的用户id
    shareUserNames = new Set();// 选中的用户名字

Page({

    /**
     * 页面的初始数据
     */
    data: {
        planId: 0,// 计划id
        plan: {
            run: 1
        },// 计划详情
        access: {} as any,// 当前用户权限
        currentUser: {},// 当前用户信息
        options: '',
        isAdmin: false,// 是否是管理员查看详情
        imgUrl: [],// 图片Url
        subPlanListObj: {},// 子任务的提交的上报列表，key为id
        galleryShow: false,// 是否显示图片预览
        shareAccounts: [],// 当前可指派的用户列表
        userDrawerVisible: false,// 右侧抽屉是否显示
        showReportInfo: false,// 是否显示上报信息
        showAssignInfo: false,// 是否显示指派信息
        showChangeShareBtn: false,// 是否显示修改指派信息

        iconSize: fontSizeCalc(40),
        tabFontSize: fontSizeCalc(28),
        labelSize: fontSizeCalc(32),
        inputSize: fontSizeCalc(32),
        tagSize: fontSizeCalc(26) + 'rpx',

        btnWidth: fontSizeCalc(320) + 'rpx',
        btnHeight: fontSizeCalc(60) + 'rpx',
        btnLineHeight: fontSizeCalc(36) + 'rpx',

        searchLock: false,// 请求锁

        currentCollapse: 1,// 收缩显示
    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        const planId = options.id || 0;
        const {globalData: {access, currentUser}} = getApp();
        this.setData({
            access,
            planId,
            isAdmin: access.线索上报x选题计划x配置x管理员,
            showReportInfo: access.线索上报x选题计划x配置x管理员 || access.线索上报x选题计划x配置x需求者,
            currentUser,
            options: JSON.stringify(options)
        })
        this.getPlanDetail(planId);
    },

    /**
     * 处理一下管理员进入时的计划状态
     * @param data
     */
    handleAdminPlanType({run}) {
        return {
            typeName: run === 1 ? '进行中' : '已结束',
            bgColor: run === 1 ? '#389E0D' : '#E75D58',
        }
    },

    /**
     * 通过id获取计划详情
     * @param id
     */
    async getPlanDetail(id) {
        let _that = this;
        const {searchLock, isAdmin} = _that.data;
        if (searchLock){
            return
        }
        _that.setData({
            searchLock: true
        })
        wx.showLoading({
            title: '查询中...'
        })
        // 执行搜索函数
        await getCuesTopicDetails({id}).then(async (response) => {
            const newPlan = response.data || {};
            const {typeName, bgColor} = this.handleAdminPlanType(newPlan);
            newPlan.bgColor = bgColor;
            newPlan.typeName = typeName;
            if(!newPlan.plans || !Array.isArray(newPlan.plans)){// 做一个容错处理
                newPlan.plans = []
            }
            if(!newPlan.shareAccounts || !Array.isArray(newPlan.shareAccounts)){// 做一个容错处理
                newPlan.shareAccounts = []
            }
            if(!newPlan.assignOrganizations || !Array.isArray(newPlan.assignOrganizations)){// 做一个容错处理
                newPlan.assignOrganizations = []
            }
            newPlan.plans.forEach(item =>{
                item.parentRun = newPlan.run
                item.title ={
                    text: item.name,
                    size: 30,
                    color: '#1890FF',
                };
                item.tag = {
                    text: '',
                    size: 24,
                    color: '#E75D58',
                }
            })
            // 指派单位
            newPlan.organizationsNames = newPlan.assignOrganizations.map(item => {
                return item && item.name
            })
            // 指派记者名字列表
            newPlan.shareNames = newPlan.shareAccounts.map(item => {
                return item && item.name
            })
            // 指派记者id列表
            newPlan.shareIds = newPlan.shareAccounts.map(item => {
                return item && item.id
            })
            shareUserIds = new Set(newPlan.shareIds);// id
            shareUserNames = new Set(newPlan.shareNames);// 名字
            // // 轮询去获取提交子任务列表
            // newPlan.plans.forEach(item =>{
            //     _that.getSubReportList(item.id)
            // })
            _that.setData({
                plan: newPlan,
                showAssignInfo: isAdmin || newPlan.isCreateAccount,// 是否显示指派信息，管理员与创建者
                showChangeShareBtn: isAdmin || newPlan.isCreateAccount,// 是否显示修改指派信息，管理员与创建者
            })
            _that.getShareAccountFun();
        }).catch(error => {
            console.warn(error)
            handleErrCode(error)
        }).finally(() => {
            wx.hideLoading();
            _that.setData({
                searchLock: false
            })
        })
    },

    /**
     * 通过id获取子任务列表
     * @param id
     */
    async getSubReportList(id) {
        let _that = this;
        // 执行搜索函数
        await getCuesSubmitPage({id}).then(async (response) => {
            const list = response.data?.data || [];
            let obj = _that.data.subPlanListObj;
            obj[id] = list;
            _that.setData({
                subPlanListObj: obj
            })
        })
    },

    /**
     * 获取可选用户列表
     */
    async getShareAccountFun() {
        let _that = this;
        // 执行搜索函数
        await getShareAccountPage({
            current: 1,
            pageSize: 1000
        }).then(async (res) => {
            if (res?.data) {
                _that.setData({
                    shareAccounts: _that.readyTreeData(
                        Array.isArray(res.data?.data) ? res.data?.data : [], true
                    )
                })
            }
        })
    },

    /**
     * 更新指派用户列表
     */
    async resetShareAccountFun() {
        let _that = this;
        const {planId:id} = _that.data;
        await resetShareAccount({
            id,
            accountIds: Array.from(shareUserIds)
        }).then(async (res) => {
            if (res?.code === 0) {``
                handleCode(res, '修改成功');
                setTimeout(() => {
                    _that.closeUserDrawer();
                    _that.getPlanDetail(id)
                }, 1000)
            } else {
                handleErrCode()
            }
        }).catch(e => {
            handleErrCode(e)
        })
    },

    /**
     * 预备Tree结构数据
     * @param data
     * @param showUnit 是否显示单位
     */
    readyTreeData(data, showUnit?: Boolean): any {
        let treeData = [];
        if (Array.isArray(data) && data) {
            data.forEach((val) => {
                treeData.push({
                    text: (showUnit ? val.organizationName + ' - ': '') + val.name,
                    value: val.id,
                    item: val,
                    children: this.readyTreeData(val.children, showUnit),
                    collapsed: false,// 默认展开
                    checked: shareUserIds.has(val.id),// 默认选中
                    // icon: val.isFolder === 0 ? 1 : 0,
                });
            });
        }
        return treeData;
    },
 /**
 * 预备Tree结构数据（已选择的）
 * @param data
 */
readyTreeData2(dataTree: [], selectIds: []): any {
  if (dataTree.length > 0) {
    let list = dataTree.map(item => {
      if (item.isChildren == 1) {
        item.children = this.readyTreeData2(item.children, selectIds);
        let noChildren = item.children.filter((item) => item.checked === 0); //过滤出未选中的
        let noLength = noChildren.length;
        if (noLength == 0) { //未选中的 == 0 ，选中状态
          let pingChildren = item.children.filter((item) => item.checked === -1); //过滤出平的，未全选中
          let pingLength = pingChildren.length;
          if (pingLength == 0) {//平的 == 0，选中状态
            item.checked = 1;
          } else {//平的 != 0, 平状态 
            item.checked = -1;
          }
        } else if (noLength == item.children.length) { //未选中的 == 孩子长度，表示 父节点 未选中
          item.checked = 0;
        } else { //未选中的 >0 && < 孩子长度，表示 父节点 平的
          item.checked = -1;
        }
      } else {
        item.checked = selectIds.includes(item.id) ? 1 : 0
      }
      return item
    })
    return list;
  }
  return []
},

    /**
     * 用户树节点 修改
     */
    userTreeNodeChange(res: { detail: any; }) {
        const detail = res?.detail;
        if (detail.checked) {// 选中了，就都加进去
            shareUserIds.add(detail.value);
            shareUserNames.add(detail.text);
        } else {// 没选中，找一下删掉
            shareUserIds.delete(detail.value)
            shareUserNames.delete(detail.text)
        }
        this.setData({
            showUserList: Array.from(shareUserNames).toString()
        })
    },

    /**
     * 显示侧面抽屉
     */
    showUserDrawer() {
        this.setData({
            userDrawerVisible: true
        })
    },

    /**
     * 关闭抽屉
     */
    closeUserDrawer() {
        this.setData({
            userDrawerVisible: false,
        })
    },

    /**
     *
     */
    subPlanClick(e: any) {
        const subPlan = e.currentTarget.dataset.item || {};
        wx.navigateTo({
            url: `/pages/planListAdmin/index?isAdmin=${this.data.isAdmin}&&id=${this.data.planId}&&planId=${subPlan.id}&&name=${subPlan.name}&&describes=${subPlan.describes}&&run=${subPlan.parentRun}`
        })
    },

    /**
     * 改变collapse
     * @param e
     */
    changeCollapse(e:any){
        const curTag = e.currentTarget.dataset.item || '';
        this.setData({
            [curTag]: this.data[curTag] === 0 ? 1 : 0
        })
    },

    /**
     * 生命周期函数--监听页面初次渲染完成
     */
    onReady() {

    },

    /**
     * 生命周期函数--监听页面显示
     */
    onShow() {
        this.getPlanDetail(this.data.planId);
        wx.hideShareMenu({
            menus: ['shareAppMessage', 'shareTimeline'],// 隐藏分享到朋友和分享到朋友圈
        })
    },

    /**
     * 生命周期函数--监听页面隐藏
     */
    onHide() {

    },

    /**
     * 生命周期函数--监听页面卸载
     */
    onUnload() {

    },

    /**
     * 页面相关事件处理函数--监听用户下拉动作
     */
    onPullDownRefresh() {

    },

    /**
     * 页面上拉触底事件的处理函数
     */
    onReachBottom() {

    },

    taskExecuteShareFun() {

    },

    /**
     * 用户点击右上角分享
     */
    onShareAppMessage() {
    }
})